"""
数据库初始化脚本 - 增强版
支持自动检测、创建和初始化数据库
"""
import os
import logging
from pathlib import Path
from .connection import db_manager
from .service import db_service

logger = logging.getLogger(__name__)

def check_database_exists():
    """检查数据库是否存在"""
    try:
        # 尝试连接数据库
        if db_manager.test_connection():
            print("✅ 数据库连接正常")
            return True
        else:
            print("❌ 数据库连接失败")
            return False
    except Exception as e:
        print(f"❌ 数据库检查异常: {e}")
        return False

def create_database_if_not_exists():
    """如果数据库不存在则创建"""
    try:
        # 这里可以添加创建数据库的逻辑
        # 对于MySQL，通常需要手动创建数据库
        print("ℹ️ 请确保数据库 'quantitative_advanced' 已存在")
        return True
    except Exception as e:
        print(f"❌ 创建数据库失败: {e}")
        return False

async def initialize_database():
    """初始化数据库"""
    try:
        print("🔍 检查数据库状态...")
        
        # 初始化连接池
        if not db_manager.initialize_pool():
            logger.error("数据库连接池初始化失败")
            return False
        
        # 检查数据库连接
        if not check_database_exists():
            print("⚠️ 数据库连接失败，尝试创建数据库...")
            if not create_database_if_not_exists():
                return False
        
        print("📋 开始创建数据库表...")
        
        # 执行所有数据库结构脚本
        schema_files = [
            ('schema.sql', '主数据库'),
            ('schema_user.sql', '用户管理'),
            ('schema_new.sql', '新功能')
        ]
        
        for schema_file, description in schema_files:
            script_path = Path(__file__).parent / schema_file
            if script_path.exists():
                print(f"📄 执行{description}脚本: {schema_file}")
                if not db_manager.execute_script(str(script_path)):
                    logger.error(f"{description}数据库结构初始化失败")
                    return False
                print(f"✅ {description}表创建成功")
            else:
                print(f"⚠️ {description}脚本文件不存在: {schema_file}")
        
        # 验证表是否创建成功
        print("🔍 验证数据库表...")
        if await verify_tables():
            print("✅ 数据库表验证成功")
        else:
            print("⚠️ 数据库表验证失败")
        
        logger.info("数据库初始化成功")
        return True
    except Exception as e:
        logger.error(f"数据库初始化失败: {e}")
        return False

async def verify_tables():
    """验证关键表是否存在"""
    try:
        # 检查关键表是否存在（来自所有schema文件）
        key_tables = [
            # 用户管理相关表（核心表）
            'users', 'activation_codes', 'user_activity_logs', 'service_packages',
            # 股票数据相关表
            'stock_fear_greed', 'stock_kline', 'stock_prophecy_model', 'stock_basic_info'
        ]
        existing_tables = []
        
        for table in key_tables:
            try:
                with db_manager.get_cursor() as cursor:
                    cursor.execute(f"SHOW TABLES LIKE '{table}'")
                    if cursor.fetchone():
                        existing_tables.append(table)
                        print(f"  ✅ {table} 表存在")
                    else:
                        print(f"  ❌ {table} 表不存在")
            except Exception as e:
                print(f"  ⚠️ 检查 {table} 表时出错: {e}")
        
        # 检查激活码数据
        try:
            with db_manager.get_cursor() as cursor:
                cursor.execute("SELECT COUNT(*) FROM activation_codes")
                count = cursor.fetchone()[0]
                print(f"  📋 激活码数量: {count}")
                if count > 0:
                    cursor.execute("SELECT code, code_type FROM activation_codes LIMIT 3")
                    codes = cursor.fetchall()
                    for code in codes:
                        print(f"    - {code[0]} ({code[1]})")
        except Exception as e:
            print(f"  ⚠️ 检查激活码数据时出错: {e}")
        
        print(f"📊 总计: {len(existing_tables)}/{len(key_tables)} 个表存在")
        
        # 确保至少要有用户相关的核心表
        user_tables = ['users', 'activation_codes']
        user_tables_exist = all(table in existing_tables for table in user_tables)
        
        if user_tables_exist:
            print("✅ 用户管理核心表验证通过")
            return True
        else:
            print("❌ 用户管理核心表验证失败")
            return False
            
    except Exception as e:
        print(f"❌ 表验证失败: {e}")
        return False

def initialize_database_sync():
    """同步初始化数据库（用于直接执行）"""
    import asyncio
    
    print("🚀 开始初始化数据库...")
    print("=" * 50)
    
    try:
        # 设置日志
        logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
        
        # 运行异步初始化
        success = asyncio.run(initialize_database())
        
        if success:
            print("✅ 数据库初始化成功！")
            
            # 测试连接
            if asyncio.run(test_database_connection()):
                print("✅ 数据库连接测试成功！")
            else:
                print("❌ 数据库连接测试失败！")
                return False
        else:
            print("❌ 数据库初始化失败！")
            return False
            
        print("=" * 50)
        print("🎉 数据库初始化完成！")
        return True
        
    except Exception as e:
        print(f"❌ 数据库初始化异常: {e}")
        return False

async def test_database_connection():
    """测试数据库连接"""
    try:
        if db_manager.test_connection():
            logger.info("数据库连接测试成功")
            return True
        else:
            logger.error("数据库连接测试失败")
            return False
    except Exception as e:
        logger.error(f"数据库连接测试异常: {e}")
        return False

def auto_setup_database():
    """自动设置数据库（一键初始化）"""
    print("🤖 自动数据库设置")
    print("=" * 50)
    
    # 1. 检查环境
    print("1️⃣ 检查数据库环境...")
    if not check_database_exists():
        print("❌ 数据库环境检查失败")
        return False
    
    # 2. 初始化数据库
    print("2️⃣ 初始化数据库表...")
    if not initialize_database_sync():
        print("❌ 数据库初始化失败")
        return False
    
    # 3. 验证结果
    print("3️⃣ 验证数据库设置...")
    import asyncio
    if asyncio.run(test_database_connection()):
        print("✅ 数据库设置完成！")
        return True
    else:
        print("❌ 数据库设置验证失败")
        return False

if __name__ == "__main__":
    # 直接执行自动设置
    auto_setup_database()
